package org.optaconf.service; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.transaction.HeuristicMixedException; import javax.transaction.HeuristicRollbackException; import javax.transaction.NotSupportedException; import javax.transaction.RollbackException; import javax.transaction.SystemException; import javax.transaction.UserTransaction; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.optaconf.domain.Conference; import org.optaconf.domain.Day; import org.optaconf.domain.Room; import org.optaconf.domain.Talk; import org.optaconf.domain.TalkExclusion; import org.optaconf.domain.Timeslot; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Path("/{conferenceId}/talk") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public class TalkService { private static final Logger LOG = LoggerFactory.getLogger(TalkService.class); @PersistenceContext(unitName = "optaconf-webapp-persistence-unit") private EntityManager em; @Inject private UserTransaction utx; @GET @Path("/") public List<Talk> getTalkList(@PathParam("conferenceId") Long conferenceId) { Conference conference = em.find(Conference.class, conferenceId); return conference.getTalkList(); } @GET @Path("/map") public Map<String, Map<String, Map<String, Talk>>> getDayTimeslotRoomToTalkMap( @PathParam("conferenceId") Long conferenceId) { Conference conference; try { utx.begin(); em.joinTransaction(); conference = em.find(Conference.class, conferenceId); conference.getDayList().iterator().hasNext(); conference.getTalkList().iterator().hasNext(); conference.getTimeslotList().iterator().hasNext(); conference.getRoomList().iterator().hasNext(); } catch (NotSupportedException | SystemException e) { throw new IllegalStateException(e); } finally { try { utx.commit(); } catch (SecurityException | IllegalStateException | RollbackException | HeuristicMixedException | HeuristicRollbackException | SystemException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Map<String, Map<String, Map<String, Talk>>> dayTimeslotRoomToTalkMap = new LinkedHashMap<String, Map<String, Map<String, Talk>>>(); for (Day day : conference.getDayList()) { dayTimeslotRoomToTalkMap.put(day.getExternalId(), new LinkedHashMap<String, Map<String, Talk>>()); } for (Timeslot timeslot : conference.getTimeslotList()) { Day day = timeslot.getDay(); LinkedHashMap<String, Talk> roomToTalkMap = new LinkedHashMap<String, Talk>(); dayTimeslotRoomToTalkMap.get(day.getExternalId()).put(timeslot.getExternalId(), roomToTalkMap); for (Room room : conference.getRoomList()) { roomToTalkMap.put(room.getExternalId(), null); } } for (Talk talk : conference.getTalkList()) { Timeslot timeslot = talk.getTimeslot(); Room room = talk.getRoom(); if (timeslot != null && room != null && room.getExternalId() != null) { Day day = timeslot.getDay(); Map<String, Map<String, Talk>> map = dayTimeslotRoomToTalkMap.get(day.getExternalId()); Map<String, Talk> map2 = map.get(timeslot.getExternalId()); map2.put(room.getExternalId(), talk); } } return dayTimeslotRoomToTalkMap; } @GET @Path("/schedule") public Conference getSchedule(@PathParam("conferenceId") Long conferenceId) { Conference conference = em.find(Conference.class, conferenceId); return conference; } @GET @Path("/{talkId}/exclusion") public List<TalkExclusion> getTalkExclusionList(@PathParam("conferenceId") Long conferenceId, @PathParam("talkId") Long talkId) { Conference conference = em.find(Conference.class, conferenceId); // TODO do proper query to DB instead of filtering here List<TalkExclusion> globalTalkExclusionList = conference.getTalkExclusionList(); List<TalkExclusion> talkExclusionList = new ArrayList<TalkExclusion>(globalTalkExclusionList.size()); for (TalkExclusion talkExclusion : globalTalkExclusionList) { if (talkExclusion.getFirstTalk().getExternalId().equals(talkId) || talkExclusion.getSecondTalk().getExternalId().equals(talkId)) { talkExclusionList.add(talkExclusion); } } return talkExclusionList; } }